
#include <iostream>
#include <signal.h>

using namespace std;
void printPending(sigset_t &set)
{
    for(int i = 31; i >= 1; i--){  // 遍历31个普通信号
        if(sigismember(&set, i) == 1){  // 判断是否存在于 set信号集中
            cout << 1;
        }
        else{
            cout << 0;
        }
    
    }
    puts("");
    puts("");
}

void  hander(int sig)
{
    cout << "我被触动了" << endl;
}
int main()
{
    signal(2, hander);   // 设置信号2的处理函数为hander
    
    // 创建一个用于操作block和peding表的信号集
    sigset_t set;  // 创建信号集
    sigemptyset(&set);  // 初始化信号集为全空
    sigaddset(&set, 2); // 添加信号2

    sigset_t oldset;
    // 设置信号屏蔽
    sigprocmask(SIG_SETMASK, &set, &oldset); // 将信号集设置到当前进程的block表中

    int cnt = 0;
    sigset_t pending;  // 创建信号集，用于获取当前未决区的内容
    while(1){
        int n = sigpending(&pending); // 获取当前进程的pending表
        if(n != -1){
            printPending(pending);  // 打印pending表
        }
        sleep(1);

        cnt ++;
        if (cnt == 5){
            sigprocmask(SIG_SETMASK, &oldset, NULL); // 解除屏蔽
        }

    }
    return 0;
}